/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Manejo.Transporte;
import Archivador.Informador;
import Manejo.Transporte.Registros.*;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Random;
/**
 *
 * @author jorge
 */
class PruebasViajes {
    private static Registros registros = new Registros();
    
    public static void iniciarRegistros(){
        RegPuertos registroPuertos = registros.obtenerRegistroPuertos();
        RegBarcos registroBarcos = registros.obtenerRegistroBarcos();
        RegNavieras registroNavieras = registros.obtenerRegistroNavieras();
        RegRutas registroRutas = registros.obtenerRegistroRutas();
        RegContenedores registroContenedores = registros.obtenerRegistroContenedores();
        
        // Crear los datos iniciales para cada registro
        // Puertos
        
        Puerto pp = new Puerto( new Localizacion( "Guatemala", 456.78, 489.23 ),
                registros);
        ID puertoQuetzal = registroPuertos.agregarPuerto(pp, "Quetzal");
        pp = new Puerto( new Localizacion( "Guatemala", 345.32, 378.234 ), 
                registros);
        ID puertoSanJose = registroPuertos.agregarPuerto(pp, "San Jose");
        pp = new Puerto( new Localizacion( "EEUU", 231.23, 329.00 ),
                registros);
        ID puertoNewYork = registroPuertos.agregarPuerto(pp, "New York");
        pp = new Puerto( new Localizacion( "Australia", 345.22, 211.32 ),
                registros);
        ID puertoKan = registroPuertos.agregarPuerto(pp, "Kan");
        pp = new Puerto( new Localizacion( "China", 345.12, 342.342 ),
                registros);
        ID puertoIch = registroPuertos.agregarPuerto(pp, "Ich" );
        pp = new Puerto( new Localizacion( "Sudafrica", 342.12, 345.23 ),
                registros);
        ID puertoHerm = registroPuertos.agregarPuerto(pp, "Herm");
        
        // Navieras
        Naviera navRGuatemala = new Naviera( "Guatemala", registros );
        ID navGuatemala = registroNavieras.agregarNaviera(navRGuatemala, "Naviera Guatemala" );
        Naviera navRMaersk = new Naviera( "EEUU", registros );
        ID navMaersk = registroNavieras.agregarNaviera( navRMaersk, "Maersk" );
        
        // Barcos
        Barco bar = new Barco( 1000.00, null, registros);
        ID barcoActual = registroBarcos.agregarBarco(bar, "SS Nuevo" );
        navRGuatemala.agregarBarco( barcoActual );
        
        
        bar = new Barco( 1500.00, null, registros);
        barcoActual = registroBarcos.agregarBarco(bar, "SS Pinta");
        navRGuatemala.agregarBarco( barcoActual );
        
        bar = new Barco( 1000.00, null, registros);
        barcoActual = registroBarcos.agregarBarco(bar, "SS Niña" );
        navRMaersk.agregarBarco( barcoActual );
        
        bar = new Barco( 1500.00, null, registros);
        barcoActual = registroBarcos.agregarBarco(bar, "SS Santa Maria" );
        navRMaersk.agregarBarco( barcoActual );
        
        // Rutas
        Random generador = new Random();
        
        /*
         * Ruta1
         * Quetzal - Ich (10 dias) - NewYork (15 dias)
         * Total: 25 dias
         */
        Ruta rut = new Ruta(registros);
        rut.agregarPuerto(registroPuertos.obtenerID("Quetzal"), 0 );
        rut.agregarPuerto(registroPuertos.obtenerID("Ich"), 10.0f );
        rut.agregarPuerto(registroPuertos.obtenerID("New York"), 15.0f );
        ID Ruta1 = registroRutas.agregarRuta(rut);
        
        /*
         * Ruta2
         * San Jose - Kan( 8 dias) - Herm( 14 dias )
         * Total: 22 dias
         */
        rut = new Ruta(registros);
        rut.agregarPuerto(registroPuertos.obtenerID("San Jose"), 0 );
        rut.agregarPuerto(registroPuertos.obtenerID("Kan"), 8.0f );
        rut.agregarPuerto(registroPuertos.obtenerID("Herm"), 14.0f);
        ID Ruta2 = registroRutas.agregarRuta(rut);
        
        /*
         * Ruta3
         * San Jose - Ich( 12 dias ) - Herm( 25 dias ) - Kan (10 días)
         * Total: 49 dias
         */
        rut = new Ruta(registros);
        rut.agregarPuerto(registroPuertos.obtenerID("San Jose"), 0);
        rut.agregarPuerto(registroPuertos.obtenerID("Ich"), 12.0f);
        rut.agregarPuerto(registroPuertos.obtenerID("Herm"), 25.0f);
        rut.agregarPuerto(registroPuertos.obtenerID("Kan"), 10.0f );
        ID Ruta3 = registroRutas.agregarRuta(rut);
        
        /*
         * Ruta4
         * Herm-Quetzal(18 dias)
         * Total: 18 días
         */
        rut = new Ruta(registros);
        rut.agregarPuerto(registroPuertos.obtenerID("Herm"), 0);
        rut.agregarPuerto(registroPuertos.obtenerID("Quetzal"), 18.0f);
        ID Ruta4=registroRutas.agregarRuta(rut);
        
        // Crear viajes
        GregorianCalendar fechaInicio = new GregorianCalendar();
        fechaInicio.set(2011, 0, 1); // 1 de enero del 2011
        
        // NOTA: Para realizar un Viaje se necesitan las siguientes cosas
        // (1) Una instancia del Viaje, con la fecha de inicio y la Ruta
        // (2) Un Barco que realizará el Viaje (asignar viaje al Barco)
        // (3*) Uno o más Contenedores que se cargarán en el Barco
        //  (3.1) Un arreglo de Productos (con uno o más elementos) por Contenedor
        /*
         * VIAJE 1
         */
        Viaje nuevoViaje = new Viaje(Ruta1, fechaInicio.getTime(),
                registros);
        Barco barcoViaje = navRGuatemala.obtenerBarcoLibre();
        barcoViaje.cambiarViaje(nuevoViaje);
        
        Producto[] prod = new Producto[1];
        prod[0] = new Producto(800.0, "Tela");
        Contenedor cont = new Contenedor(prod, puertoNewYork,
                "Telas de Guatemala", registros );
        barcoViaje.cargar(cont);
        
        /*
         * VIAJE 2
         */
        nuevoViaje = new Viaje(Ruta2, fechaInicio.getTime(),
                registros);
        barcoViaje = navRGuatemala.obtenerBarcoLibre();
        barcoViaje.cambiarViaje(nuevoViaje);
        
        prod[0] = new Producto( 200.0, "Jamon" );
        cont = new Contenedor( prod, puertoIch, "Toledo", registros );
        barcoViaje.cargar(cont);
        
        prod[0] = new Producto( 200.0, "Queso" );
        cont = new Contenedor( prod, puertoHerm, "Toledo", registros );
        barcoViaje.cargar(cont);
        
        prod[0] = new Producto( 200.0, "Especies" );
        cont = new Contenedor( prod, puertoKan, "Caña Real", registros );
        barcoViaje.cargar(cont);
        
        
        /*
         * VIAJE 3
         */
        nuevoViaje = new Viaje(Ruta3, fechaInicio.getTime(),
                registros);
        barcoViaje = navRMaersk.obtenerBarcoLibre();
        barcoViaje.cambiarViaje(nuevoViaje);
        
        prod[0] = new Producto( 300.0, "Azucar" );
        cont = new Contenedor( prod, puertoKan, "Azucarera", registros );
        barcoViaje.cargar(cont);
        
        prod[0] = new Producto( 520.0, "Juguetes" );
        cont = new Contenedor( prod, puertoKan, "Nintendo", registros );
        barcoViaje.cargar(cont);
        
        prod[0] = new Producto( 100.0, "Videos" );
        cont = new Contenedor( prod, puertoHerm, "El Duende", registros );
        barcoViaje.cargar(cont);
    }
    
    public static void main( String[] args ){
//        iniciarRegistros();        
//        registros.guardarTodo();
//        Informador.guardarCambios();
//        return;
        
        
        // Mostrar progreso de todos los Barcos
        System.out.println("*** BARCOS - ESTADO INICIAL ***");
        RegBarcos registroBarcos = registros.obtenerRegistroBarcos();
        for( String nombreBarco: registroBarcos.obtenerNombresDeBarcos() ){
            Barco barcoActual = registroBarcos.obtenerBarco(nombreBarco);
            System.out.println( nombreBarco + " - " + barcoActual.obtenerViaje() );
        }
        
        // Avanzar los Barcos hasta que lleguen a su destino
        GregorianCalendar fechaActual = new GregorianCalendar( 2011, 0, 1 );
        boolean todosDestino = false;
        while( !todosDestino ){
            todosDestino = true;
            // Avanzar a cada Barco a la fechaActual
            for( Barco barcoActual : registroBarcos.obtenerTodosBarcos() ){
                ID idBarco = registroBarcos.obtenerID(barcoActual);
                Viaje viajeActual = barcoActual.obtenerViaje();
                if( viajeActual == null )
                    continue;
                
                boolean antes = viajeActual.viajeCompletado();
                viajeActual.avanzarPuerto(fechaActual.getTime(), idBarco);
                todosDestino = todosDestino && viajeActual.viajeCompletado();
                
                // Revisar si el Barco llego hoy al Puerto
                if( antes != viajeActual.viajeCompletado() )
                    System.out.println("--LLEGADA (" + fechaActual.getTime() + "): " +
                           registroBarcos.obtenerNombre(idBarco) );
            }
            
            // Avanzar un dia en la fecha
            fechaActual.add( Calendar.HOUR, 1 );
        }
        
        
        // Mostrar los contenidos en cada puerto
        System.out.println("\n*** PUERTOS - ESTADO FINAL ***");
        RegPuertos registroPuertos = registros.obtenerRegistroPuertos();
        for (String nombrePuerto : registroPuertos.obtenerNombresDePuertos()) {
            Puerto puertoActual = registroPuertos.obtenerPuerto(nombrePuerto);
            System.out.println( nombrePuerto + " - Recibido = " +
                    Arrays.toString( puertoActual.obtenerContenedoresRecibidos() ) );
        }
        
        //registros.guardarTodo();
        //Informador.guardarCambios();
    }
}
